"""
主程序 - 演示如何使用AudioClient进行语音识别
"""
import logging
import time
from audio_client import AudioClient

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

def on_speech_recognized(text: str):
    """语音识别回调函数"""
    print(f"🎤 识别到语音: {text}")
    
    # 这里可以添加处理逻辑，比如调用下一个函数
    response = process_text(text)
    
    # 将响应输出为语音（这里只是打印，实际可以使用TTS）
    print(f"🔊 响应: {response}")


def process_text(input_text: str) -> str:
    """
    处理识别到的文字，返回响应
    这里是示例函数，你可以替换为实际的业务逻辑
    """
    input_text = input_text.strip()
    
    # 简单的响应逻辑示例
    if "你好" in input_text or "hello" in input_text.lower():
        return "你好！很高兴见到你！"
    elif "时间" in input_text or "几点" in input_text:
        import datetime
        now = datetime.datetime.now()
        return f"现在是 {now.strftime('%Y年%m月%d日 %H点%M分')}"
    elif "天气" in input_text:
        return "今天天气不错，适合出门。"
    elif "再见" in input_text or "拜拜" in input_text:
        return "再见！期待下次见面！"
    else:
        return f"我听到你说：{input_text}。这很有趣！"


def main():
    """主函数"""
    print("🎯 语音识别系统启动中...")
    
    # 百度语音识别配置
    # 注意：请替换为你的实际配置
    BAIDU_APP_ID = "your_app_id"
    BAIDU_API_KEY = "your_api_key" 
    BAIDU_SECRET_KEY = "your_secret_key"
    
    try:
        # 方式1: 使用AudioClient.begin()创建客户端
        audioclient = AudioClient.begin(
            sample_rate=16000,
            channels=1,
            chunk_size=1024,
            vad_threshold=0.5,
            vad_frame_duration=30,
            silence_timeout=2.0,
            baidu_app_id=BAIDU_APP_ID,
            baidu_api_key=BAIDU_API_KEY,
            baidu_secret_key=BAIDU_SECRET_KEY
        )
        
        print("✅ AudioClient初始化成功")
        
        # 方式1: 使用回调函数进行持续监听
        print("\n🔴 开始持续监听模式（按Ctrl+C停止）...")
        audioclient.start_listening(callback=on_speech_recognized)
        
        try:
            # 持续运行直到用户中断
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            print("\n⏹️ 用户中断，停止监听...")
            audioclient.stop_listening()
        
        # 方式2: 阻塞式获取单次结果
        print("\n🔵 单次识别模式...")
        print("请说话，等待识别结果...")
        
        audioclient.start_listening()
        result = audioclient.run(timeout=10)  # 等待10秒
        
        if result:
            print(f"📝 识别结果: {result}")
            response = process_text(result)
            print(f"💬 响应: {response}")
        else:
            print("⏰ 超时，没有检测到语音")
        
        audioclient.stop_listening()
        
        # 方式3: 使用上下文管理器
        print("\n🟢 使用上下文管理器模式...")
        with AudioClient.begin(
            baidu_app_id=BAIDU_APP_ID,
            baidu_api_key=BAIDU_API_KEY,
            baidu_secret_key=BAIDU_SECRET_KEY
        ) as client:
            print("请说话...")
            result = client.run_once()
            if result:
                print(f"📝 最终结果: {result}")
                response = process_text(result)
                print(f"💬 最终响应: {response}")
        
    except Exception as e:
        print(f"❌ 错误: {e}")
        logging.error(f"程序执行错误: {e}", exc_info=True)


def demo_simple_usage():
    """演示最简单的使用方式"""
    print("🚀 简单使用演示...")
    
    # 最简单的使用方式
    audioclient = AudioClient.begin(
        baidu_app_id="your_app_id",
        baidu_api_key="your_api_key", 
        baidu_secret_key="your_secret_key"
    )
    
    # 启动监听并获取结果
    audioclient.start_listening()
    result = audioclient.run()
    
    print(f"识别结果: {result}")
    audioclient.stop_listening()


def demo_continuous_mode():
    """演示持续监听模式"""
    print("🔄 持续监听演示...")
    
    def speech_handler(text):
        print(f"收到语音: {text}")
        # 在这里处理语音结果
    
    audioclient = AudioClient.begin(
        baidu_app_id="your_app_id",
        baidu_api_key="your_api_key",
        baidu_secret_key="your_secret_key"
    )
    
    # 启动持续监听
    audioclient.start_listening(callback=speech_handler)
    
    # 让程序运行一段时间
    time.sleep(30)
    
    # 停止监听
    audioclient.stop_listening()


if __name__ == "__main__":
    # 运行主程序
    main()
    
    # 如果想运行演示，可以取消注释下面的行
    # demo_simple_usage()
    # demo_continuous_mode()